"""
用户图书阅读位置数据库操作类
提供用户阅读进度的批量插入、更新操作
"""

import time
from typing import List, Dict, Any, Literal
from db.operations import BaseOperations


class UserReadingPositionsOperations(BaseOperations):
    """用户图书阅读位置数据库操作类"""

    def __init__(self):
        # 继承BaseOperations，指定表名为user_reading_positions
        super().__init__("user_reading_positions")

    async def batch_upsert_reading_positions(
        self, reading_positions_data: List[Dict[str, Any]]
    ) -> int:
        """
        批量插入/更新用户阅读位置数据
        如果记录不存在就插入，如果存在就更新

        Args:
            reading_positions_data (List[Dict[str, Any]]): 阅读位置数据列表
            每个字典应包含阅读位置的字段，例如：
            {
                "user_id": 1,
                "book_id": 123,
                "position": 150,  # 阅读位置（页码或章节等）
                "created_at": 1686825600,  # 创建时间戳（可选，自动生成）
                "updated_at": 1686825600   # 更新时间戳（可选，自动生成）
            }

        Returns:
            int: 成功插入/更新的记录数量
        """
        if not reading_positions_data:
            return 0

        # 验证必要字段
        valid_data = []
        for data in reading_positions_data:
            if "user_id" not in data or "book_id" not in data:
                print("警告：数据中缺少必要字段(user_id, book_id)，跳过该条记录")
                continue
            valid_data.append(data.copy())  # 创建副本避免修改原数据

        if not valid_data:
            return 0

        # 调用父类的批量插入方法，使用update策略处理重复键
        return await self.batch_insert(valid_data, on_duplicate="update")

    async def batch_query_reading_positions(
        self, user_book_ids: List[Dict[str, int]] = None
    ) -> List[Dict[str, Any]]:
        """
        批量查询用户阅读位置记录
        可以根据用户ID列表或图书ID列表进行查询

        Args:
            user_book_ids : List[Dict[str, int]]: 用户ID和图书ID列表
            每个字典可以包含：
            {
                "user_id": 1,
                "book_id": 123
            }
        Returns:
            List[Dict[str, Any]]: 阅读位置记录列表
            每个字典包含：
            {
                "user_id": 1,
                "book_id": 123,
                "position": 150,
                "created_at": 1686825600,
                "updated_at": 1686825600
            }
        """
        if not user_book_ids:
            return []

        # 构建查询条件
        where_conditions = []
        params = []

        for item in user_book_ids:
            user_id = item.get("user_id")
            book_id = item.get("book_id")

            if user_id and book_id:
                where_conditions.append("(user_id = %s AND book_id = %s)")
                params.extend([user_id, book_id])

        if not where_conditions:
            return []

        where_clause = " OR ".join(where_conditions)
        order_by = "updated_at DESC"

        return await self.batch_query(
            where_clause=where_clause, params=tuple(params), order_by=order_by
        )
